昨天先介紹了 HITCON CTF,台灣第一個世界級的 CTF 賽事,今天就來介紹一下 DEF CON CTF,DEFCON CTF 可以說是 CTF 的奧運 (都一樣沒獎金拿),每個 CTF 隊伍都以拿 DEF CON CTF 的冠軍為目標,但從 2013 年 LegitBS 接手舉辦 DEF CON CTF 以來 ,至今只有美國、韓國兩個隊伍拿到過冠軍
DEF CON 是一個資安研討會,在 1993 年由 Jeff Moss 發起,名稱由來是來自電影的情節,因為電影劇情中將 Les Vegas 設定成核武器攻擊的地點,因此 DEF CON 選在 Las Vegas 舉辦,一直到今年是第 27 屆都保持這個慣例
舉辦 DEF CON CTF 是一件非常辛苦的工作,因此每隔幾年就會換人舉辦,目前的主辦方是 Order of the Overflow,台灣第一次參加是在 2014 年,當時的主辦方是 LegitBS,LegitBS 在 2013 ~ 2017 這五年之間,為 DEF CON CTF 設計了許多不同但有趣的賽制,尤其是 Attack & Defense 的賽制,到現在依然被大部分的 A&D 比賽給沿用
這三年的 final 賽制都是 Attack & Defense,但有應對參賽隊伍想的各種奇技淫巧而對規則做調整,基本規則如下:
2013 和 2014 年都是由 PPP 奪冠,2015 韓國聯隊 DEFKOR 在天才駭客 lokihardt 的帶領之下,成功打倒 PPP 獲得冠軍,之後有空再來寫這件事 XD
2016 年與 DARPA 舉辦的 Cyber Grand Challenge 一同進行,讓人類與電腦進行攻防對決,除了從種子賽和 Quals 入圍的隊伍以外,還多了一隊 CGC 冠軍的 AI 隊伍
2016 由 PPP 奪回冠軍,HITCON 獲得第四,我這年缺席沒參加 T___T
在 2016 比完 LegitBS 就宣布要自己搞一個指令集作為明年的題目,但一直到比賽開始之前都沒有公布相關訊息,讓我們一度懷疑是不是做不出來要出包了...XD 結果在比賽前一天才公布 cLEMENCy 的 spec,讓三天的 CTF 比賽直接變四天.....QQ 逼前一天大家開始黑客松趕工處理 cLEMENCy 的工具
cLEMENCy 有一些很煩人的 feature ...
重新定義 1 byte = 9 bit,但我們的電腦還是 8 bit ... XD 也就是說如果要用我們的電腦處理 cLEMENCy 的題目,要將所有 stream 從 8 bit 轉為 9 bit 才能夠操作 XD
一個 register 操作的 data 為 27 bit,以 middle-endien 儲存,沒聽過 middle-endien ? 正常,因為是 cLEMENCy 自行定義...
Each byte is 9 bits of data, bit 0 is the left most significant bit. Middle-Endian data stores bits 9 to 17, followed by bits 0 to 8, then bits 18 to 27 in memory when handling three bytes. Two bytes of data will have bits 9-17 then bits 0 to 8 written to memory.
如果對 cLEMENCy 的指令集有興趣的可以參考這份 82 頁的 pdf:https://2017.notmalware.ru/89dc90a0ffc5dd90ea68a7aece686544/clemency-201707271159.pdf
2017 還是由 PPP 獲得冠軍.....QQ HITCON 亞軍,中國聯隊 A*0*E 獲得季軍,DEFKOR 失去 lokihardt 的帶領之後獲得第四
2018 年開始改由 OOO 主辦 DEF CON CTF,賽制改成 A&D 和 KoH 混合的賽制,但 A&D 變成只能透過主辦方的網頁進行防禦,而網路架構也徹底切開,讓以前 A&D 會偷塞 backdoor 之類的玩法沒辦法使用,雖然說讓大家更專注於題目本身的競賽上,但也少了很多樂趣 QQ
2018 年的比賽必須說是一場災難....XD 由於 OOO 初辦比賽缺乏經驗,許多 infrastructure 在比賽中都發生問題,像是:會場網路、score board、patch system 之類的....,當年將參賽隊伍數量提高到 24 隊也造成 loading 出乎主辦方的預期
但 2019 年就回歸正常,雖然在 A&D 的設計上還是有些小瑕疵,但題目難度和品質已經可以稱得上是 DEF CON CTF 的水準,讓我們一同期待明年的 DEF CON CTF (?)
這題是 2014 年 DEF CON CTF Quals HITCON 戰隊能擠進 Final 的關鍵,當時離快結束時我們還在 20 名之外,一直到快結束之前這題被放出來,我們在倒數前一小時集結全隊之力解出了這題,最後以 28 分、第 12 名的成績進入決賽 (沒錯,標題的 4 指的是 4 分,這場比賽題目的分數只有 1~5 分)
題目一開始給了兩個檔案,一個是 public key pub.pem
,另一個是 raw binary comeandgetme.enc
,pub.pem 的內容如下:
-----BEGIN PUBLIC KEY-----
MEEwDQYJKoZIhvcNAQEBBQADMAAwLQImC1+CPNtJhcI2UiY7iabqbVRDkz0le0uq
dgc87QWlj7qE+QS9LTcCAwEAAQ==
-----END PUBLIC KEY-----
顯然是個很短的 key,用 openssl 觀察後可以得知是個只有 308 bit RSA public key,經過一陣努力之後,可以透過 yafu 爆出 p 和 q,再計算出 d 之後就可以解密 comeandgetme.enc
,過濾掉一些不重要的訊息之後得到了短網址,網址提供了一個 mp3 給我們下載
聽了 15 分鐘的英文之後,發現 mp3 的最後一段有雜訊,經過一番猜測後,得到粗的是 0,細的是 1,把 bit 轉回 ascii binary 之後是一串的 printable 字串:
7rKM^ATVEq+D>k=E-"&n06:]FG%kGtF"T4%0f1M(BOP^nG@b
0@<l9o@4lD.04o$/B4!SU@:j+-AM@XR2e"R&3A<-q2E#,&2)[EQAS,O_AnE/oDIal'FEDJC3\N.-ATDs.@qB^61,(F>/ot]7Ci"<,E,8s.@:s"$D.PA3D.R'01LsuL2E*EJ3&3KN0K1gK1b^jsA2lJ%3FOa!0On`
這一串看起來像亂碼的字串可以用 ascii85 decode,會得到兩個 url:
後面的 hash 看起來有少,我們假設他是 32 byte 嘗試進行 brute force,完整的 url 會是 http://services.2014.shallweplayaga.me/eme_23dc0673382940749407ad8619a410cc
下載檔案之後得到一個 elf,從檔案內的字串推測是拿來 encrypt flag 的工具,逆向完可以知道加密規則是以 4 byte 為單位的 block cipher,而且是 ECB 模式,前後 block 不會互相影響加密結果,也發現如果將 The flag is:
丟進 binary 加密後跟加密後的 flag 前 8 byte 相同,證實我們的想法正確
在評估加密的執行速度之後,我們認為可以用 brute force 來得到原本的 flag,將所有 4 byte 的字元組合都丟進 binary 進行加密,再比對哪些出現在加密後的 flag 裡面,這樣就知道原本加密前的 flag 是什麼,得到了類似以下內容:
['fa\xb2\xc0'] The
['K\x16\xf4\x11'] flag
['\n-2F'] is:
['\xd9\xcb\x8d\x9d'] I h
['k\x88rP'] ope
['\xe4\x83w\r'] that
['\xe5\xb1\xd8\x14'] did
['\xc22H\x02'] n't
['T\xa1\xa4\x92'] suck
['abW\x95'] too
['5\x94\x13\x92'] muc
['[\x0f\x84\xaa']
由於產生字典檔時把忽略了 null byte 導致最後一個 block 沒成功找到配對的明文,但可以腦補一下直接猜 flag 是 I hope that didn't suck too much.
,最後成功得到 4 分擠進 DEF CON 22 final,並於第一次參賽就獲得第二名的佳績......一直也是到現在最佳名次 T___T